// 10218
/**
 * 遍历集合中的每个元素，返回所有通过真值检测的元素组成的数组
 * filter([1, 2, 3, 4, 5], function(val) {
     return val % 2 === 0;
    }); // -> [2, 4]
 * dependencies safeCb each types
 * @param {*} obj  要遍历的集合
 * @param {*} predicate  真值检测函数
 * @param {*} ctx  函数上下文
 * @returns 包含所有通过真值检测元素的数组
 */
export function filter (obj, predicate, ctx) {
  
  var ret = [];
  predicate = safeCb(predicate, ctx);
  each(obj, function (val, idx, list) {
    if (predicate(val, idx, list)) ret.push(val);
  });
  return ret;
}